package com.tianruan.dc.common.base.entity.dto;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.databind.jsonschema.JsonSerializableSchema;
import com.tianruan.dc.common.utils.IdGen;
import com.tianruan.dc.common.utils.StringUtils;
import com.tianruan.dc.modules.sys.user.entity.dto.UserDTO;
import com.tianruan.dc.modules.sys.user.utils.UserUtils;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.codehaus.jackson.map.annotate.JsonSerialize;
import org.springframework.format.annotation.DateTimeFormat;

import java.util.Date;
import java.util.Iterator;
import java.util.Map;

/**
 * @PS 基础DTO类
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class BaseDTO<T> {

    /**
     * 实体编号（唯一标识）
     */
    protected String id;

    @JsonIgnore
    protected Integer current = 1;
    @JsonIgnore
    protected Integer pageSize = 20;

    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    protected Date startDate;
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    protected Date endDate;
    protected Date equalsDate;

    protected String remarks;	// 备注
    protected String createBy;	// 创建者
    protected Date createDate;	// 创建日期
    protected String updateBy;	// 更新者
    protected Date updateDate;	// 更新日期
    protected String delFlag; 	// 删除标记（0：正常；1：删除；2：审核）

    protected String searchContent; // 搜索内容

    protected String sorter;

    protected Boolean isAdmin;

    // 格式
    public void setSorter(String sorter) {
        String sorterString = "";
        Map map = JSON.parseObject(sorter, Map.class);
        Iterator<Map.Entry<String, String>> iterator = map.entrySet().iterator();
        while (iterator.hasNext()){
            Map.Entry<String, String> next = iterator.next();
            sorterString += next.getKey() + " ";
            if(StringUtils.equals(next.getValue(), "descend")) {
                sorterString += "desc";
            } else if (StringUtils.equals(next.getValue(), "ascend")) {
                sorterString += "asc";
            }
            if (iterator.hasNext()) {
                sorterString += ",";
            }
        }
        this.sorter = StringUtils.equals(sorterString, "") ? null: sorterString;
    }

    /**
     * 是否是新记录（默认：false）
     */
    @JsonIgnore
    protected Boolean isNewRecord = false;

    public BaseDTO(String id) {
        this();
        this.id = id;
    }

    /**
     * 插入之前执行方法，需要手动调用
     */
    public void preInsert(){
        // 不限制ID为UUID，调用setIsNewRecord()使用自定义ID
        if (!this.isNewRecord){
            setId(IdGen.uuid());
        }
        UserDTO user = UserUtils.getUser();
        if (org.apache.commons.lang3.StringUtils.isNotBlank(user.getId())){
            this.updateBy = user.getId();
            this.createBy = user.getId();
        }
        this.updateDate = new Date();
        this.createDate = this.updateDate;
        this.delFlag = "0";
    }

    /**
     * 更新之前执行方法，需要手动调用
     */
    public void preUpdate(){
        UserDTO user = UserUtils.getUser();
        if (org.apache.commons.lang3.StringUtils.isNotBlank(user.getId())){
            this.updateBy = user.getId();
        }
        this.updateDate = new Date();
    }

    /**
     * 插入之前执行方法，需要手动调用
     */
    public void preInsertAdmin(){
        // 不限制ID为UUID，调用setIsNewRecord()使用自定义ID
        if (!this.isNewRecord){
            setId(IdGen.uuid());
        }
        this.updateBy = "1";
        this.createBy = "1";
        this.updateDate = new Date();
        this.createDate = this.updateDate;
        this.delFlag = "0";
    }

    /**
     * 更新之前执行方法，需要手动调用
     */
    public void preUpdateAdmin(){
        this.updateBy = "1";
        this.updateDate = new Date();
    }

    /**
     * 是否是新记录
     */
    public boolean getIsNewRecord() {
        // 判断是新数据或者是id为空就是新数据
        return isNewRecord || StringUtils.isBlank(this.getId());
    }

//    public static void do2dto(T) {
//
//    }
//
//    public static void dto2do() {
//
//    }

}
